import java.awt.Robot
import java.awt.event.InputEvent

/**
 * @description 阴阳师魂土挂机脚本
 * @author pony
 */

// 1、录入基本数据
def user = [5000, 12, 999, 2560, 1600, 1.5] as User
// 开会战斗按钮坐标
def battleButtonX = user.pcLong * 0.8476..user.pcLong * 0.9570
def battleButtonY = user.pcWidth * 0.75..user.pcWidth * 0.9375
// 点击屏幕继续空白区域坐标
def whiteButtonX = user.pcLong * 0.3151..user.pcLong
def whiteButtonY = user.pcWidth * 0.5..user.pcWidth * 0.9375
// 2、创建机器人对象
def robot = new Robot()
// 3、创建一个随机数对象
def random = new Random()

/**
 * 随机延迟时间函数：模拟人手点击鼠标，防止反脚本检测，例如：0.3 - 0.5s 中间取一个随机数
 */
def delayS = {double beginTime, double endTime -> // 固定计算公式，生成一个 beginTime 到 endTime 的随机数
  double v = beginTime + random.nextDouble() * (endTime-beginTime)
  v = v * 1000
  robot.delay((int)v)
}

/**
 * 鼠标左键一次点击事件，鼠标点击到抬起动作，中间随机 0.3-0.5 s（人类正常手速）
 */
def mousePress = { ->
  // 按下鼠标左键
  robot.mousePress(InputEvent.BUTTON1_DOWN_MASK)
  // 鼠标按下到弹起的时间间隔（随机间隔0.2-0.5s）
  delayS.call(0.2, 0.5)
  // 鼠标左键弹起
  robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK)
  delayS.call( 1, 1.5)
}

/**
 * 鼠标移动点击事件：一次游戏按钮点击事件，鼠标移动并点击，完成后默认间隔1-1.5s
 */
def clickButton = {int x, int y ->
  // 鼠标移动
  robot.mouseMove(x, y)
  delayS.call( 0.2, 0.5)
  // 鼠标左键按下
  mousePress()
  delayS.call( 1, 1.5)
}

/**
 * 生成一个区域内的随机坐标
 */
def randomXY = {double xMin,  double xMax, double yMin, double yMax ->
  def x = xMin + random.nextDouble() * (xMax - xMin)
  def y = yMin + random.nextDouble() * (yMax - yMin)
  [x, y]
}

// 5s钟后开始执行脚本
robot.delay(5000)

user.battleNum.times { int it ->
  // 开始对局，点击战斗按钮，获取战斗按钮内部的一个随机的光标值
  def buttonXY = randomXY(battleButtonX.from, battleButtonX.to, battleButtonY.from, battleButtonY.to)
  clickButton((int)buttonXY[0], (int)buttonXY[1])

  // 2、战斗中... 12s
  // 时间间隔 12-14s，刷打一局所用的时间12s
  delayS.call(user.battleTime+6, user.battleTime+7)

  // 3、结束对局，按任意键继续
  def whiteXY = randomXY(whiteButtonX.from, whiteButtonX.to, whiteButtonY.from, whiteButtonY.to)
  clickButton((int)whiteXY[0], (int)whiteXY[1])

  //4、再次点击开始战斗
  // 鼠标按下到弹起的时间间隔（随机间隔0.2-0.4s）
  delayS.call(0, 1)

  // 当刷够一定的次数(100-200次)时，人会累会休息，随机休息20s-60s
  int ranTimes = 100 + random.nextInt() * (200-100)
  if (it == ranTimes){
    delayS(20, 60)
  }
}